{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "\n",
    "# 读取数据\n",
    "# path to where the data lies\n",
    "alldata = pd.read_csv(\"diabetes.csv\")\n",
    "alldata.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.63994726  0.84832379  0.14964075 ...  0.20401277  0.46849198\n",
      "   1.4259954 ]\n",
      " [-0.84488505 -1.12339636 -0.16054575 ... -0.68442195 -0.36506078\n",
      "  -0.19067191]\n",
      " [ 1.23388019  1.94372388 -0.26394125 ... -1.10325546  0.60439732\n",
      "  -0.10558415]\n",
      " ...\n",
      " [ 0.3429808   0.00330087  0.14964075 ... -0.73518964 -0.68519336\n",
      "  -0.27575966]\n",
      " [-0.84488505  0.1597866  -0.47073225 ... -0.24020459 -0.37110101\n",
      "   1.17073215]\n",
      " [-0.84488505 -0.8730192   0.04624525 ... -0.20212881 -0.47378505\n",
      "  -0.87137393]]\n"
     ]
    }
   ],
   "source": [
    "y_all = alldata['Outcome']\n",
    "X_all = alldata.drop(['Outcome'],axis=1)\n",
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_all = ss_X.fit_transform(X_all)\n",
    "print(X_all)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Anaconda2\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(614L, 8L)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_all, y_all, train_size = 0.8,random_state = 0)\n",
    "X_train_part.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(154L, 8L)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_val.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.92      0.88       107\n",
      "          1       0.76      0.62      0.68        47\n",
      "\n",
      "avg / total       0.82      0.82      0.82       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[98  9]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)\n",
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.785714285714\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.766233766234\n",
      "accuracy: 0.798701298701\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handlers could be found for logger \"matplotlib.legend\"\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x65fb278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train_part,y_train_part, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.850649350649\n",
      "accuracy: 0.961038961039\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.902597402597\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.811688311688\n",
      "accuracy: 0.928571428571\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.850649350649\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.876623376623\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbf2b198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy\n",
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 4, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_all, y_all, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n",
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#从图中可以看出log(gamma)=2.0,logc=0时，效果最好。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
